package cn.edu.xjtu.work.twoSum;

import java.util.HashMap;
import java.util.Map;

/**
 * 167. 两数之和 II - 输入有序数组
 * 
 * 给定一个已按照 升序排列  的整数数组 numbers ，请你从数组中找出两个数满足相加之和等于目标数 target
 * 
 * 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ，
 * 
 * 所以答案数组应当满足 1 <=answer[0]< answer[1] <= numbers.length 。
 * 
 */
public class SolutionII {
  /**
   * 哈希表
   * 
   * @param numbers
   * @param target
   * @return
   */
  public int[] twoSum(int[] numbers, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < numbers.length; i++) {
      if (map.containsKey(target - numbers[i])) {
        return new int[] { map.get(target - numbers[i]), i + 1 };
      } else {
        map.put(numbers[i], i + 1);
      }
    }
    return null;
  }

  /**
   * 双指针,一个指向开头,一个指向最后,两个相加结果与target对比
   * 
   * @param numbers
   * @param target
   * @return
   */
  public int[] twoSum1(int[] numbers, int target) {
    int left = 0;
    int right = numbers.length - 1;
    while (left != right) {
      int val = numbers[left] + numbers[right];
      if (val == target) {
        return new int[] { left + 1, right + 1 };
      } else if (val > target) {
        right--;
      } else {
        left++;
      }
    }
    return null;
  }
}
